﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.InteropServices;

namespace Sped.Sped
{
    /// <summary>
    /// REGISTRO 0200: TABELA DE IDENTIFICAÇÃO DO ITEM (PRODUTOS E SERVIÇOS)
    /// </summary>
    [ClassInterface(ClassInterfaceType.AutoDual)]
    [ProgId("SpedPisCofins.Reg0200")]
    [ComVisible(true)]
    public class Reg0200 : IBloco
    {
        /// <summary>
        /// Código do item
        /// </summary>
        public string COD_ITEM { get; set; }
        /// <summary>
        /// Descrição do item
        /// </summary>
        public string DESCR_ITEM { get; set; }
        /// <summary>
        /// Representação alfanumérico do código de barra do produto, se houver.
        /// </summary>
        public string COD_BARRA { get; set; }
        /// <summary>
        /// Código anterior do item com relação à última informação apresentada.
        /// </summary>
        public string COD_ANT_ITER { get; set; }
        /// <summary>
        /// Unidade de medida utilizada na quantificação de estoques.
        /// </summary>
        public string UNID_INV { get; set; }
        /// <summary>
        /// Tipo do item – Atividades Industriais, Comerciais e Serviços:
        ///     00 – Mercadoria para Revenda;
        ///     01 – Matéria-Prima;
        ///     02 – Embalagem;
        ///     03 – Produto em Processo;
        ///     04 – Produto Acabado;
        ///     05 – Subproduto;
        ///     06 – Produto Intermediário;
        ///     07 – Material de Uso e Consumo;
        ///     08 – Ativo Imobilizado;
        ///     09 – Serviços;
        ///     10 – Outros insumos;
        ///     99 – Outras
        /// </summary>
        public string TIPO_ITEM { get; set; }
        /// <summary>
        /// Código da Nomenclatura Comum do Mercosul
        /// </summary>
        public string COD_NCM { get; set; }
        /// <summary>
        /// Código EX, conforme a TIPI
        /// </summary>
        public string EX_IPI { get; set; }
        /// <summary>
        /// Código do gênero do item, conforme a Tabela 4.2.1.
        /// </summary>
        public string COD_GEN { get; set; }
        /// <summary>
        /// Código do serviço conforme lista do Anexo I da Lei Complementar Federal nº 116/03
        /// </summary>
        public string COD_LST { get; set; }
        /// <summary>
        /// Alíquota de ICMS aplicável ao item nas operações internas
        /// </summary>
        public double ALIQ_ICMS { get; set; }


        public override bool ValidaRegistro(ref string Erro)
        {
            var ValidacaoOK = true;
            Erro = "";

            if (string.IsNullOrEmpty(this.COD_ITEM))
            {
                this.COD_ITEM = string.Empty;
                Erro += "\r\n* Registro 0200 - Código do Item não informado.";
                ValidacaoOK = false;
            }

            if (string.IsNullOrEmpty(this.DESCR_ITEM))
            {
                this.DESCR_ITEM = string.Empty;
                Erro += "\r\n* Registro 0200 - Descrição do Item não informado.";
                ValidacaoOK = false;
            }

            if (string.IsNullOrEmpty(this.COD_BARRA))
                this.COD_BARRA = string.Empty;

            if (string.IsNullOrEmpty(this.COD_ANT_ITER))
                this.COD_ANT_ITER = string.Empty;

            if (string.IsNullOrEmpty(this.UNID_INV))
                this.UNID_INV = string.Empty;

            if (string.IsNullOrEmpty(this.TIPO_ITEM) || !(Funcoes.StringIN(this.TIPO_ITEM, "00-01-02-03-04-05-06-07-08-09-10-99")))
            {
                this.TIPO_ITEM = string.Empty;
                Erro += "\r\n* Registro 0200 - Tipo do item inválido.";
                ValidacaoOK = false;
            }

            if (string.IsNullOrEmpty(this.COD_NCM))
                this.COD_NCM = string.Empty;

            if (string.IsNullOrEmpty(this.EX_IPI))
                this.EX_IPI = string.Empty;

            if (string.IsNullOrEmpty(this.COD_GEN))
                this.COD_GEN = string.Empty;

            if (string.IsNullOrEmpty(this.COD_LST))
                this.COD_LST = string.Empty;

            return ValidacaoOK;
        }

        public override string Layout()
        {
            var Linha = string.Empty;

            Linha += "0200" + this.Delimitador;
            Linha += this.COD_ITEM.Trim() + this.Delimitador;
            Linha += this.DESCR_ITEM.Trim().TirarAcento() + this.Delimitador;
            Linha += this.COD_BARRA.Trim() + this.Delimitador;
            Linha += this.COD_ANT_ITER.Trim() + this.Delimitador;
            Linha += this.UNID_INV.Trim() + this.Delimitador;
            Linha += this.TIPO_ITEM.Trim() + this.Delimitador;
            Linha += this.COD_NCM.Trim().removeFormatacao() + this.Delimitador;
            Linha += this.EX_IPI.Trim() + this.Delimitador;
            Linha += this.COD_GEN.Trim() + this.Delimitador;
            Linha += this.COD_LST.Trim() + this.Delimitador;
            Linha += this.ALIQ_ICMS.FormatoValorSped(2) + this.Delimitador;

            return Linha.Trim();
        }
    }
}
